#!/usr/bin/env python3
"""
数据库初始化脚本
创建数据库表和初始数据
"""

from database import engine, Base, test_db_connection, test_redis_connection
from models.user import User
from models.contact import Contact
from sqlalchemy.orm import sessionmaker
from passlib.context import CryptContext
import sys

# 密码加密
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def create_tables():
    """创建所有表"""
    try:
        print("🔄 正在创建数据库表...")

        # 手动删除可能存在的表（忽略外键约束）
        SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
        db = SessionLocal()
        try:
            # 禁用外键检查
            db.execute("SET FOREIGN_KEY_CHECKS = 0")

            # 删除可能存在的表
            tables_to_drop = [
                'email_logs', 'email_tasks', 'email_templates',
                'email_configs', 'data_sources', 'contacts', 'users',
                'email_contacts'  # 可能存在的其他表
            ]

            for table in tables_to_drop:
                try:
                    db.execute(f"DROP TABLE IF EXISTS {table}")
                except:
                    pass  # 忽略不存在的表

            # 重新启用外键检查
            db.execute("SET FOREIGN_KEY_CHECKS = 1")
            db.commit()
        finally:
            db.close()

        # 重新创建所有表
        Base.metadata.create_all(bind=engine)
        print("✅ 数据库表创建成功")
        return True
    except Exception as e:
        print(f"❌ 创建数据库表失败: {e}")
        return False


def create_admin_user():
    """创建默认管理员用户"""
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    db = SessionLocal()
    
    try:
        # 检查是否已存在管理员用户
        admin_user = db.query(User).filter(User.username == "admin").first()
        if admin_user:
            print("ℹ️  管理员用户已存在")
            return True
        
        # 创建管理员用户
        hashed_password = pwd_context.hash("admin123")
        admin_user = User(
            username="admin",
            email="admin@mailspeed.com",
            password_hash=hashed_password,
            role="admin"
        )
        
        db.add(admin_user)
        db.commit()
        print("✅ 默认管理员用户创建成功")
        print("   用户名: admin")
        print("   密码: admin123")
        print("   邮箱: admin@mailspeed.com")
        return True
        
    except Exception as e:
        print(f"❌ 创建管理员用户失败: {e}")
        db.rollback()
        return False
    finally:
        db.close()


def create_sample_contacts():
    """创建示例联系人数据"""
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    db = SessionLocal()
    
    try:
        # 检查是否已存在联系人数据
        existing_contacts = db.query(Contact).count()
        if existing_contacts > 0:
            print("ℹ️  联系人数据已存在")
            return True
        
        # 创建示例联系人
        sample_contacts = [
            Contact(name="张三", email="zhangsan@example.com", phone="13800138001", department="技术部"),
            Contact(name="李四", email="lisi@example.com", phone="13800138002", department="市场部"),
            Contact(name="王五", email="wangwu@example.com", phone="13800138003", department="人事部"),
            Contact(name="赵六", email="zhaoliu@example.com", phone="13800138004", department="财务部"),
            Contact(name="钱七", email="qianqi@example.com", phone="13800138005", department="技术部"),
        ]
        
        for contact in sample_contacts:
            db.add(contact)
        
        db.commit()
        print("✅ 示例联系人数据创建成功")
        return True
        
    except Exception as e:
        print(f"❌ 创建示例联系人数据失败: {e}")
        db.rollback()
        return False
    finally:
        db.close()


def main():
    """主函数"""
    print("🚀 开始初始化数据库...")
    
    # 测试数据库连接
    if not test_db_connection():
        print("❌ 数据库连接失败，请检查配置")
        sys.exit(1)
    
    # 测试Redis连接
    if not test_redis_connection():
        print("❌ Redis连接失败，请检查配置")
        sys.exit(1)
    
    # 创建表
    if not create_tables():
        print("❌ 数据库初始化失败")
        sys.exit(1)
    
    # 创建管理员用户
    if not create_admin_user():
        print("❌ 管理员用户创建失败")
        sys.exit(1)
    
    # 创建示例联系人
    if not create_sample_contacts():
        print("❌ 示例数据创建失败")
        sys.exit(1)
    
    print("🎉 数据库初始化完成！")
    print("\n📝 接下来可以:")
    print("1. 启动后端服务: python main.py")
    print("2. 访问API文档: http://localhost:8000/docs")
    print("3. 使用管理员账号登录: admin / admin123")


if __name__ == "__main__":
    main()
